import axios from 'axios'
import router from '../router'
import { Loading, Message } from 'element-ui'
import md5 from 'js-md5'
let loadinginstace
// 默认值
axios.defaults.timeout = 120000
axios.defaults.baseURL = 'http://47.104.208.209:83/'
// axios.defaults.baseURL = 'http://192.168.0.116:5244/'
// axios.defaults.baseURL = 'http://192.168.0.125/DTcms.WebAPI/'
// axios.defaults.headers.common['zzTs'] = ts
// axios.defaults.headers.common['Sign'] = md5(sign)

// 添加请求拦截器
axios.interceptors.request.use(config => {
  // 判断localStorage中是否存在api_token
  // if (localStorage.getItem('api_token')) {
  // // 存在将api_token写入 request header
  // config.headers.apiToken = '11111'
  // }
  let ts = Date.now().toString().substr(0, 10)
  let sign = 'A5838652986888zzts=' + ts + 'A85E8589-C369-0783-8521-1C71E89A19BD'
  config.headers.zzTs = ts
  config.headers.Sign = md5(sign)
  loadinginstace = Loading.service({ fullscreen: true })
  return config
}, function (error) {
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(response => {
  loadinginstace.close()
  return response
}, function (error) {
  return Promise.reject(error)
})

// get请求
function fetch (url, params = {}) {
  return axios({
    method: 'get',
    url,
    params
  }).then(
    (response) => {
      return checkStatus(response)
    }
  )
  // .then(
  //   (res) => {
  //     return checkCode(res)
  //   }
  // )
}

// post请求
function post (url, data = {}) {
  return axios({
    method: 'post',
    url,
    data: data
  }).then(
    (response) => {
      return checkStatus(response)
    }
  )
}

// 上传文件请求
function upfile (url, fileobj) {
  let param = new FormData()
  param.append('files', fileobj.file)
  return axios({
    method: 'post',
    url: url,
    headers: { 'Content-Type': 'multipart/form-data' },
    data: param
  }).then(
    (response) => {
      return checkStatus(response)
    }
  )
}

/**
 * 状态码
 */
function statusCode (response) {
  switch (response.status) {
    case 401:
      Message.error({
        message: '未授权，请登录',
        onClose: function () {
          router.push({ name: 'login' })
        }
      })
      break
    case 403:
      Message.error({
        message: '拒绝访问',
        onClose: function () {
          router.push({ name: 'login' })
        }
      })
      break
    case 404:
      Message.error({
        message: '请求地址出错',
        onClose: function () {
          router.push({ name: 'login' })
        }
      })
      break
    case 408:
      Message.error({
        message: '请求超时',
        onClose: function () {
          router.push({ name: 'login' })
        }
      })
      break
    case 500:
      Message.error({
        message: '服务器内部错误',
        onClose: function () {
          router.push({ name: 'login' })
        }
      })
      break
    default:
      return response.data
  }
}
/**
 * 请求发出后检查返回的状态码,统一捕获正确和错误的状态码，正确就直接返回response,错误就自定义一个返回对象
 * @param {object} response 响应对象
 * @return {object} 响应正常就返回响应数据否则返回错误信息
 **/
function checkStatus (response) {
  // 如果http状态码正常，则直接返回数据
  if (response && (response.status === 200 || response.status === 304 || response.status === 400)) {
    if (response.data.result === -1) {
      Message.error({
        message: '请求出错',
        onClose: function () {
          // router.push({ name: 'error-404' })
        }
      })
    } else {
      return response.data
    }
  } else {
    // 异常状态下，把错误信息返回去
    return statusCode(response)
  }
}
/**
 * 检查完状态码后需要检查后如果成功了就需要检查后端的状态码处理网络正常时后台语言返回的响应
 * @param {object} res 是后台返回的对象或者自定义的网络异常对象，不是http 响应对象
 * @return {object} 返回后台传过来的数据对象，包含code,message,data等属性，
 */
// function checkCode (res) {
//   // 如果code异常(这里已经包括网络错误，服务器错误，后端抛出的错误)，可以弹出一个错误提示，告诉用户
//   if (res.data && (res.status !== 200)) {
//     return statusCode(res)
//   }
//   return res
// }

export {
  fetch,
  post,
  upfile
}
